from fase import Fase, db_session
from sqlalchemy import exc
from flask import flash
session = db_session()

from itemManager import ItemManager

itemMgr = ItemManager()

class FaseManager(object):
    """Clase encargada del manejo de fases"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Fase Manager>'
    
    def guardarFase(self, fase):
        """
        Metodo encargado de almacenar una fase en la base de datos
        @param fase: Objeto fase que se desea guardar.
        """
        session.add(fase)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("La fase ya existe", "error")
        else:
            return flash("Fase registrada exitosamente")
#        session.close()
        
    def eliminarFase(self, idfase):
        """
        Metodo encargado de eliminar una fase de la base de datos
        @param idfase: id de la fase que se desea eliminar.
        """
#       session = db_session()
        fase = session.query(Fase).filter(Fase.idfase==idfase).first()
        session.delete(fase)
        session.commit()
        
    def getFase(self, idfase):
        """
        Metodo encargado de retornar una fase dado su idfase
        @param idfase: id de la fase que se desea obtener.
        """
        fase = session.query(Fase).filter(Fase.idfase==idfase).first()
        return fase
    
    def getFases(self):
        """Metodo encargado de retornar todas las fases de la base de datos"""
        fases = session.query(Fase).order_by(Fase.numero)
        return fases
    
    def getFaseFiltradoPorNombre(self, nombre):
        """
        Metodo encargado de retornar una fase dado su nombre
        @param nombre: nombre de la fase se desea obtener.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"
        fase = session.query(Fase).filter(Fase.nombre.like(nombre)).order_by(Fase.numero)
        return fase
    
    def getFasePorNombre(self, nombre):
        """
        Metodo encargado de retornar una fase dado su nombre
        @param nombre: nombre de la fase que se desea obtener.
        """
        fase = session.query(Fase).filter(Fase.nombre==nombre).first()
        return fase
    
    def getFasePorNumero(self, numero, idproyecto):
        """
        Metodo encargado de retornar una fase dado su numero y proyecto
        @param numero: numero de la fase que se desea obtener.
        @param idproyecto: id del proyecto cuya fase se desea obtener.
        """
        fase = session.query(Fase).filter(Fase.numero==numero).filter(Fase.idproyecto==idproyecto).first()
        return fase
    
    def getFasesPorProyecto(self, idproyecto):
        """
        Metodo encargado de retornar las fases de un proyecto
        @param idproyecto: id del proyecto cuyas fases se desea obtener.
        """
        fase = session.query(Fase).filter(Fase.idproyecto==idproyecto).order_by(Fase.numero).all()
        return fase

    def getRolesDeFase(self, idfase):
        """
        Metodo encargado de retornar los roles de una fase
        @param idfase: id de la fase cuyos roles se desea obtener.
        """
        fase = session.query(Fase).filter(Fase.idfase==idfase).first()  
        return fase.roles
    
    def getTiposFase(self, idfase):
        """
        Metodo encargado de retornar los tipos de item de una fase
        @param idfase: id de la fase cuyos tipos de item se desean obtener.
        """
        fase = session.query(Fase).filter(Fase.idfase==idfase).first()  
        return fase.tipos

    def getLineasFase(self, idfase):
        """
        Metodo encargado de retornar las lineas base de una fase
        @param idfase: id de la fase cuyas lineas base se desean obtener.
        """
        items = itemMgr.getItemsPorFase(idfase)
        lineas = []
        for item in items:
            if item.lineaBase not in lineas:
                lineas.append(item.lineaBase)
        return lineas

                    
